package com.azt.api.service;

import com.azt.api.dto.CartListData;
import com.azt.api.dto.CartProduct;
import com.azt.api.dto.ProductData;
import com.azt.api.dto.hot.ProHotFloorExt;
import com.azt.api.dto.hot.ProShopFloorExt;
import com.azt.api.dto.hot.ProShopHotExt;
import com.azt.api.dto.item.ProSkuExt;
import com.azt.api.dto.item.ProductExt;
import com.azt.api.dto.item.SkuModel;
import com.azt.api.dto.shop.ProCategory;
import com.azt.api.dto.shop.ProSearchParam;
import com.azt.api.pojo.ProSku;
import com.azt.api.pojo.ProSkuAttr;
import com.azt.api.pojo.Product;
import com.azt.api.pojo.ProductStock;
import com.azt.exception.BaseException;
import com.azt.model.page.TPagination;

import java.util.List;
import java.util.Map;

public interface ProductService {

    void updateProductSelective(Product product);

    void updateProduct(Product product);

    void updateCenPrice(int skuId, double cenPrice);

    void updateHotPrice(int skuId, double hotPrice);

    void insertProductStockSelective(ProductStock productStock);

    void updateProSkuSelective(ProSku proSku);

    /**
     * 计算下单商品单价
     * */
    Double calcProductPrice(boolean isSigned, boolean isCenMember, boolean isHotProduct, Double memberPrice, Double hotPrice, Double cenPrice);

    Double calcProductPrice(int skuId, int buyerId);

    boolean isHotProduct(int productId);

    List<Map> searchProduct(Map param);

    Product getProductById(int productId);

    List<CartProduct> findCartProduct(String skuIds);

    void saveProduct(Product product);

    /**
     * 待审核的商品数量
     * */
    int getAuditProductCount(int companyId);


    List<Map> searchMgrProduct(Map param);

    int getMgrProductSkuCount(Map param);

    /**
     * 修改商品价格
     * */
    void updateProductPrice(int skuId, Double price, Double memberPrice, Double hotPrice, Double cenPrice);

    List<ProSku> findProSkuByProId(int productId);

    /**
     * 根据sku获取唯一的pro_sku，sku为null时获取无规格的
     * */
    ProSku getProSkuBySku(int productId, String sku, Integer removed);

    /**
     * 发布/更新商品
     * @param productData 商品
     * */
    void publishProduct(ProductData productData) throws BaseException;

    List<ProSkuAttr> findSkuAttrBySkuId(int skuId);

    /**
     * 根据供应商id,父类目id ,查该店,该类目下对应的,子类目名称与产品数量
     *
     * @param customerId 供应商id
     * @param pcateid    父类目id  为null时,取第一级对应的类目
     *                   父类目id对应的类目如果没有子类目,则取当前类目对应的名称与数量
     *
     *                   Created by 张栋 on 2017/2/8 13:49
     */
    List<ProCategory> getProCategory(Integer customerId, Integer pcateid);

    /**
     * 逻辑删除pro_sku
     * */
    void removeProSku(int skuId);

    void removeAllProSku(int productId);

    List<ProductExt> guessYouLike(int cateId);

    /**
     * 根据检索条件查寻,并分页
     * @param param 检索参数
     *              <p>
     *              Created by 张栋 on 2017/2/8 13:54
     */
    TPagination<ProductExt> getProductList(ProSearchParam param);


    /**
     * 上架、下架商品
     * @param productIdList 商品id数组
     * @param up 是否上架，true上架、false下架
     * */
    void upDownProduct(List<Integer> productIdList, boolean up);

    /**
     * 逻辑删除商品
     * */
    void removeProduct(List<Integer> productIdList);

    /**
     * 查产品包括扩展属性
     * Created by 张栋 on 2017/2/20 18:58
     */
    ProductExt getProductExtById(Integer productid);

    /**
     * 根据产品id获取sku扩展
     * Created by 张栋 on 2017/2/21 14:12
     */
    List<ProSkuExt> getProSkuExtByProductId(Integer porductid);

    /**
     * skumodel供页面展示
     * Created by 张栋 on 2017/2/21 16:55
     */
    List<SkuModel> geteProModelByProductId(Integer porductid);

    /**
     *
     * Created by 张栋 on 2017/2/21 18:35
     */
    List<ProSku> getProSkuByProductId(Integer productid);

    ProSku getProSkuById(int skuId);

    /**
     * 解析购物车商品
     * @param cartList 购物车商品数据(Map的格式{skuId:xx, quantity:xx})
     * @param isSigned 采购商是否已签约
     * */
    List<CartListData> parseCartData(List<Map> cartList, boolean isSigned);

    /**
     * 爆品价
     * Created by 张栋 on 2017/2/27 10:40
     */
    List<ProHotFloorExt> getHotProductFloor();

    /**
     * 商城首页  楼层
     * Created by 张栋 on 2017/2/27 15:40
     */
    List<ProShopFloorExt> getProShopFloor();

    /**
     * 获取商城首页 爆品
     * Created by 张栋 on 2017/2/27 19:08
     */
    List<ProShopHotExt> getProShopHot();
    
    public String getProductIdsByCompanyId(Integer companyId);
    
    void addHitTimes(Integer productId);

    /**
     * 获取公司下面的所有包含集采价的商品
     * */
    List<Product>  findProductWithCenSku(int companyId);

    /**
     * 加载商品的列表
     * @param size
     * @return
     */
    List<Product> listProductIdAndTime(int size);

}
